/*
 * @Author: “ygnnli” “1585923072@qq.com”
 * @Date: 2024-08-03 20:36:54
 * @LastEditors: “ygnnli” “1585923072@qq.com”
 * @LastEditTime: 2024-08-03 22:25:40
 * @FilePath: /110/50/udp_echo_server/Dict.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once

#include <iostream>
#include <string>
#include <unordered_map>
#include "Dict.hpp"
#include <fstream>
#include "Log.hpp"

namespace dict_ns
{
    const std::string defaultpath = "./Dict.txt";
    const std::string sep = ": ";
    class Dict
    {
    public:
        bool Load()
        {

            std::ifstream in(_dict_conf_filepath); // 打开文件路径
            if (!in.is_open())
            {
                LOG(FATAL, "open %s error\n", _dict_conf_filepath.c_str()); //
                return false;
            }
            std::string line;
            while (std::getline(in, line)) // 逐行读取文件
            {
                if (line.empty())
                    continue;              // 如果行为空，则跳过
                auto pos = line.find(sep); // 找到冒号的位置
                if (pos == std::string::npos)
                    continue;                           // 如果找不到冒号，TXT格式错了
                std::string word = line.substr(0, pos); // 截取冒号前面的单词
                if (word.empty())
                    continue;                                    // 如果单词为空，则跳过
                std::string han = line.substr(pos + sep.size()); // 截取冒号后面的汉字
                if (han.empty())
                    continue; // 如果汉字为空，则跳过

                LOG(DEBUG, "load info, %s, %s\n", word.c_str(), han.c_str()); // 打印加载信息
                _dict.insert(std::make_pair(word, han));                      // 将单词和汉字插入我的字典中打印
            }
            in.close();                                                  // 关闭文件
            LOG(DEBUG, "load %s sucess\n", _dict_conf_filepath.c_str()); // 已经将TXT文件加载到内存中
            return true;
        }

        Dict(const std::string &path = defaultpath) : _dict_conf_filepath(path)
        {
            Load();
        }

        std::string Translate(const std::string &word, bool &ok)
        {
            ok = true; // 结果是正确的
            auto iter = _dict.find(word);
            if (iter == _dict.end())
            {
                ok = false; // 结果是错误的
                return "未找到！";
            }
            // return _dict[word];
            return iter->second; // 返回汉字
        }

        ~Dict() {}

    private:
        std::unordered_map<std::string, std::string> _dict; // 字典
        std::string _dict_conf_filepath;                    // 配置文件路径
    };
}
